在作数据分析处理时,数据往往包含多个变量,而较多的变量会带来分析问题的复杂性。主成分分析(Principal components analysis,以下简称PCA)是一种通过降维技术把多个变量化为少数几个主成分的统计方法,是最重要的降维方法之一。它可以对高维数据进行降维减少预测变量的个数,同时经过降维除去噪声,其最直接的应用就是压缩数据,具体的应用有:信号处理中降噪,数据降维后可视化等。
PCA把原先的n个特征用数目更少的m个特征取代,新的m个特征一要保证最大化样本方差,二保证相互独立的。新特征是旧特征的线性组合,提供一个新的框架来解释结果。
如果用 $x_{1}, x_{2}, \cdots, x_{p}$表示 $p$ 门课程,$c_{1}, c_{2}, \cdots, c_{p}$ 表示各门课程的权重,那么加权之和就是$$s=c_{1} x_{1}+c_{2} x_{2}+\cdots+c_{p} x_{p}$$
我们希望选择适当的权重能更好地区分学生的成绩。每个学生都对应一个这样的综合成绩,记为 $s_{1}, s_{2}, \cdots, S_{h}$ ,$n$ 为学生人数。如果这些值很分散,表明区分得好,即是说, 需要寻找这样的加权,能使$s_{1}, s_{2}, \cdots, s_{h}$ 尽可能的分散,下面来看它的统计定义
设 $X_{1}, X_{2}, \cdots, X_{p}$ 表示以 $x_{1}, x_{2}, \cdots, x_{p}$为样本观测值的随机变量,如果能找到$c_{1}, c_{2}, \cdots, c_{p}$使得$$\operatorname{Var}\left(c_{1} X_{1}+c_{2} X_{2}+\cdots+c_{p} X_{p}\right)$$的值达到最大,则由于方差反映了数据差异的程度,因此也就表明我们抓住了这 $p$ 个变量的最大变异。当然,上式必须加上某种限制,否则权值可选择无穷大而没有意义,通常规定$$ c_{1}^{2}+c_{2}^{2}+\cdots+c_{p}^{2}=1 $$
在此约束下,求上式的最优解。由于这个解是 p − 维空间的一个单位向量,它代表一个“方向”,它就是常说的主成分方向。 一个主成分不足以代表原来的 p 个变量,因此需要寻找第二个乃至第三、第四主成分,第二个主成分不应该再包含第一个主成分的信息,统计上的描述就是让这两个主成分的协方差为零,几何上就是这两个主成分的方向正交。具体确定各个主成分的方法如下:
设 $Z_{i}$ 表示第 $i$个主成分,$i=1,2, \cdots, p$,可设 $$ \left\{\begin{array}{l}Z_{1}=c_{11} X_{1}+c_{12} X_{2}+\cdots+c_{1 p} X_{p} \\ Z_{2}=c_{21} X_{1}+c_{22} X_{2}+\cdots+c_{2 p} X_{p} \\ \cdots \ldots \ldots \ldots \ldots \ldots \ldots \ldots \ldots \ldots \\ Z_{p}=c_{p 1} X_{1}+c_{p 2} X_{2}+\cdots+c_{p p} X_{p}\end{array}\right. $$
其中对每一个$i$ ,均有$c_{i 1}^{2}+c_{i 2}^{2}+\cdots+c_{i p}^{2}=1$,且$\left(c_{11}, c_{12}, \cdots, c_{1 p}\right)$ 使得 $\operatorname{Var}\left(Z_{1}\right)$的值达到最大;$\left(c_{21}, c_{22}, \cdots, c_{2 p}\right)$不仅垂直于$\left(c_{11}, c_{12}, \cdots, c_{1 p}\right)$ ,而且使 $\operatorname{Var}\left(Z_{2}\right)$的值达到最大; $\left(c_{31}, c_{32}, \cdots, c_{3 p}\right)$ 同时垂直于$\left(c_{21}, c_{22}, \cdots, c_{2 p}\right)$和$\left(c_{11}, c_{12}, \cdots, c_{1 p}\right)$,并使$\operatorname{Var}\left(Z_{3}\right)$ 的值 达到最大;以此类推可得全部 p 个主成分,这项工作用手做是很繁琐的,但借助于计 算机很容易完成。剩下的是如何确定主成分的个数
注意事项
1)主成分分析的结果受量纲的影响,由于各变量的单位可能不一样,如果各自改变量纲,结果会不一样,这是主成分分析的最大问题,回归分析是不存在这种情况的,所以实际中可以先把各变量的数据标准化,然后使用协方差矩阵或相关系数矩阵进行分析。
2)在实际研究中,由于主成分的目的是为了降维,减少变量的个数,故一般选取少量的主成分(不超过5或6个),只要它们能解释变异的70%~80%(称累积贡献率)就行了。
在制定服装标准的过程中,对128名成年男子的身材进行了测量,每人测得的指标中含有这样六项:身高(x1)、坐高(x2) 、胸围(x3) 、手臂长(x4) 、肋围(x5)和腰围(x6) 。
协方差与相关系数
协方差用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。 期望值分别为$E[X]$与$E[Y]$的两个实随机变量X与Y之间的协方差$Cov(X,Y)$定义为:
$$ \begin{aligned} \operatorname{Cov}(X, Y) &=E[(X-E[X])(Y-E[Y])] \\ &=E[X Y]-2 E[Y] E[X]+E[X] E[Y] \\ &=E[X Y]-E[X] E[Y] \end{aligned} $$从直观上来看,协方差表示的是两个变量总体误差的期望。
定义$\rho_{X Y}$称为随机变量X和Y的(Pearson)相关系数 $$ \rho_{X Y}=\frac{\operatorname{Cov}(X, Y)}{\sqrt{D(X)} \sqrt{D(Y)}} $$
协方差/相关矩阵,其是由矩阵各行与各列间的协方差/相关系数组成的。也就是说,协方差/相关矩阵第i行第j列的元素是原矩阵第i列和第j列的协方差/相关系数。
下表为前三个特征值、特征向量以及贡献率
特征值从大到小排列,特征向量和特征值对应从大到小排列。前三个主成分分别为:($x_{i}^{*}$是标准化后变量) $$y_1= 0.469x_{1}^{*}+0.404x_{2}^{*}+0.394x_{3}^{*}+0.408x_{4}^{*}+0.337x_{5}^{*}+0.427x_{6}^{*}$$ $$y_2=−0.365x_{1}^{*}−0.397x_{2}^{*}+0.397x_{3}^{*}−0.365x_{4}^{*}+0.569x_{5}^{*}+0.308x_{6}^{*}$$ $$y_3=−0.092x_{1}^{*}+0.613x_{2}^{*}−0.279x_{3}^{*}−0.705x_{4}^{*}+0.164x_{5}^{*}+0.119x_{6}^{*}$$
贡献率计算公式
总方差中属于第$i$主成分$y_i$的比例为 $$ \frac{\lambda_{i}}{\sum_{i=1}^{p} \lambda_{i}} $$ 称为主成分$y_i$的贡献率。累计贡献率就是多个主成分贡献率的加和,$\lambda_{i}$为特征值
解释主成分。观察系数发现第一主成分系数多为正数,且变量都与身材大小有关系,称第一主成分为(身材)大小成分;类似分析,称第二主成分为形状成分(或胖瘦成分),称第三主成分为臂长成分。
(结合一定的经验和猜想,解释主成分,不是所有的主成分都能被合理的解释)
步骤总结
设有$m$条$n$维数据即$m$个样本
1.对原始数据标准化(减去对应变量的均值,再除以其方差)
2.求出自变量的协方差矩阵(或相关系数矩阵);
3.求出协方差矩阵(或性关系数矩阵)的特征值及对应的特征向量;
4.将特征向量按对应特征值大小从上到下按行排列成矩阵;
5.利用前k个特征值和特征向量计算出前k个主成分;
6.将主成分用于回归(主成分回归)、评估正态性、寻找异常值,以及通过方差接近于零的主成分发现原始变量间的多重共线性关系等。
参考文献
代码1
import numpy as np
import matplotlib.pyplot as plt
x=np.array([2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1])
y=np.array([2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])
#此处以上为上一步
mean_x=np.mean(x)
mean_y=np.mean(y)
scaled_x=x-mean_x
scaled_y=y-mean_y
data=np.matrix([[scaled_x[i],scaled_y[i]] for i in range(len(scaled_x))])
#画图看分布情况
plt.plot(scaled_x,scaled_y,'o')
plt.show()
cov=np.cov(scaled_x,scaled_y) #求协方差矩阵(Covariance Matrix)
print(cov)
[[0.61655556 0.61544444] [0.61544444 0.71655556]]
eig_val, eig_vec = np.linalg.eig(cov) #求协方差矩阵(Covariance Matrix)的特征根和特征向量
#控制图x、y轴显示范围
plt.plot(scaled_x,scaled_y,'o',)
xmin ,xmax = scaled_x.min(), scaled_x.max()
ymin, ymax = scaled_y.min(), scaled_y.max()
dx = (xmax - xmin) * 0.2
dy = (ymax - ymin) * 0.2
plt.xlim(xmin - dx, xmax + dx)
plt.ylim(ymin - dy, ymax + dy)
#将特征向量加到我们原来的图里:
plt.plot([eig_vec[:,0][0],0],[eig_vec[:,0][1],0],color='red')
plt.plot([eig_vec[:,1][0],0],[eig_vec[:,1][1],0],color='red')
#数据直接乘以特征向量矩阵,以特征向量为基底,重新构建了空间
new_data=np.transpose(np.dot(eig_vec,np.transpose(data)))
plt.plot(new_data[:,0],new_data[:,1],'^',color='blue')
plt.show()
其中红线就是特征向量。有几点值得注意:
#使用sort函数排序
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(len(eig_val))]
eig_pairs.sort(reverse=True)
#从eig_pairs选取前k个特征向量就行。这里,我们只有两个特征向量,选一个最大的。
feature=eig_pairs[0][1]
new_data_reduced=np.transpose(np.dot(feature,np.transpose(data)))
代码2
from sklearn.decomposition import PCA
x=np.array([2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1])
y=np.array([2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])
data=np.array([[scaled_x[i],scaled_y[i]] for i in range(len(scaled_x))])
pca=PCA(n_components=1)
pca.fit(data)
pca.transform(data)
array([[-0.82797019], [ 1.77758033], [-0.99219749], [-0.27421042], [-1.67580142], [-0.9129491 ], [ 0.09910944], [ 1.14457216], [ 0.43804614], [ 1.22382056]])